Fork me on GitHub
余鸢

Google Guava isNullOrEmpty用于集合

我看到Guava有String的isNullOrEmpty实用程序方法

1
Strings.isNullOrEmpty(str)

我们有什么类似的 Lists吗? 就像是

1
Lists.isNullOrEmpty(list)

这应该是等效的

1
list == null || list.isEmpty()

此外,我们有什么类似的Arrays吗? 就像是

1
Arrays.isNullOrEmpty(arr)

这应该是等效的

1
arr == null || arr.length == 0

这种方法不存在于Guava,不要再钻牛角尖了!

我们不相信“null或empty”是一个你真正想要问一个集合的问题。

如果集合可能为null,并且null应该被视为与empty相同,那么得到所有的歧义,从前面的方式,像这样:

1
2
3
4
Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
foos = ImmutableSet.of();
}

或者像这样(如果你喜欢):

1
2
Set<Foo> foos = MoreObjects.firstNonNull(
NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

之后,通常你可以只使用.isEmpty()。 在调用naughty API后立即执行此操作,并且您将奇怪的事情放在了后面,而不是让它无限期地继续。

如果“null真的意味着空集合”没有返回给你,但传递给你,你的工作很容易:只是让一个NullPointerException抛出,并使该调用者形成。

你会倾向于找到整个Guava 的一件事是,他们往往是非常反对nulls。 作者希望不鼓励你使用尽可能多的null,并提供实用方法以使其更容易使用null将对此目的适得其反。

如果你想使用Guava的范式,考虑这个集合(或数组)的源是否真的应该返回null。 如果没有,考虑标记它@NonNull并返回空集合而不是null。 或者作为一个函数的参数,期望没有null值列表,请考虑使用Preconditions.checkNotNull,如果一个null(意外)传入,抛出一个异常。

如果null真的是合法的,list == null || list.isEmpty()不是那么难。

在commons-collections中有一个CollectionUtils.isEmpty())。

Spring框架有专门的util类叫CollectionUtils。 而你正在寻找的方法是:org.springframework.util.CollectionUtils.isEmpty。 它对null和空集合返回true。

对于数组,有org.springframework.util.ObjectUtils.isEmpty方法,它的行为非常相似。

Apache CollectionUtils 4有一个方法 CollectionUtils.emptyIfNull(),如果集合为null,则返回一个空列表。 这在foreach循环中非常有用,所以你不需要在迭代之前做一个空检查

我的解决方案是:MoreObjects.firstNonNull(list, Collections. emptyList())

我使用Guava MoreObjects与JDK集合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void listnull() {
List<String> list = null;
for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
System.out.println(str);
}
list = new ArrayList<String>();
list.add("http://stackoverflow.com/");
for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
System.out.println(str);
}
}